package org.azmat.demojpa.SQL.JPA.Service;

import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import org.azmat.demojpa.SQL.JPA.Dao.StudentsDao;
import org.azmat.demojpa.SQL.JPA.Entity.Students;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class StudentsService {


    @Autowired
    private StudentsDao studentsDao;

    // 查看
    public List<Students> findAll() {
        return studentsDao.findAll();
    }

    // 查看
    public Students findById(int id) {
        return studentsDao.findById(id).orElse(new Students());
    }

    /**
     * 根据学生对象的属性搜索学生列表
     *
     * @param students 包含搜索条件的学生对象，属性值不为null且不为空的字段将作为搜索条件
     * @return 符合搜索条件的学生列表
     */
    public List<Students> searchStudents(Students students) {
        // 创建一个动态查询的规范
        Specification<Students> spec = new Specification<Students>() {
            @Override
            public Predicate toPredicate(Root<Students> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                // 收集所有的谓词条件
                List<Predicate> predicates = new ArrayList<Predicate>();

                // 如果学生姓名不为空且不是空字符串，则添加模糊查询的谓词
                if (students.getName() != null && !students.getName().isEmpty()) {
                    predicates.add(criteriaBuilder.like(root.get("name").as(String.class), "%" + students.getName() + "%"));
                }

                // 如果学生年龄大于0，则添加精确查询的谓词
                if (students.getAge() > 0) {
                    predicates.add(criteriaBuilder.equal(root.get("age").as(Integer.class), students.getAge()));
                }

                // 将所有的谓词结合成一个“与”条件
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        // 使用规格化查询学生列表
        return studentsDao.findAll(spec);
    }

}
